<!DOCTYPE HTML>
<html>

<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>第 5 页 | backend | DeepThought</title>
  <meta name="google-site-verification" content="Ei6mmDdf-cJwox1RvJOeX8Dc720fqWjZQu-Ww2BjBt4">
  
  <meta name="author" content="积慕">
  
  <meta name="description" content="个人博客知识分享,知识需沉淀,更需分享">
  
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  
  <meta property="og:site_name" content="DeepThought">

  
  <meta property="og:image" content>
  

  <link href="https://pic.zhuliang.ltd/favicon.ico" rel="shortcut icon" type="image/x-icon">
  <link rel="alternate" href="/atom.xml" title="DeepThought" type="application/atom+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">

  <link rel="stylesheet" href="//at.alicdn.com/t/font_1187293_8fec2ou5fyx.css">

  <!-- <link rel="stylesheet" href="//cdn.bootcss.com/highlight.js/9.6.0/styles/github.min.css"> -->
  <!-- <script src="//cdn.bootcss.com/highlight.js/9.6.0/highlight.min.js"></script> -->
  <script src="/js/highlight.min.js"></script>

  <link rel="stylesheet" href="/css/markdown.css">

  <script src="/js/av-min.3.0.4.js"></script>
  <script src="/js/Valine.min.1.3.6.js"></script>

</head></html>

<body>
  <header id="header" class="inner"><div class="alignleft">
  <h1><a href="/">DeepThought</a></h1>
  <h2><a href="/">知识需沉淀，更需分享</a></h2>
</div>
<nav id="main-nav" class="alignright">
  <ul>
    
      <li><a href="/">首页</a></li>
    
      <li><a href="/about">关于我</a></li>
    
      <li><a href="/atom.xml">订阅RSS</a></li>
    
  </ul>
  <div class="clearfix"></div>
</nav>
<div class="clearfix"></div>
        </header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper">
<h2  style="background:#fff; border-bottom: 1px solid #ddd; padding-bottom:17.5px; padding-top:17.5px; padding-left:5px;margin-bottom: 0px;color:#999;font-weight:normal;text-shadow:0 0 1px #fff;">
  <i class="iconfont  icon-category" style="margin-right:5px;"></i>
   分类：backend</h2>


  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/Elasticsearch-Nest-QuickStart.html">Elasticsearch.Nest 教程系列 1：Nest 快速入门</a></h1>
  


      
        <time datetime="2020-01-10T09:37:01.000Z">
          create: 2020-01-10 17:37:01 | update: 2020-01-14 17:45:42
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;2k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;8&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译（更加本土化），并非完全将官方文档进行翻译，而是在查阅、测试原始文档并转换为自己真知灼见后的“准”翻译。有不同见解 / 说明不周的地方，还请海涵、不吝拍砖 ：）</li>
<li>官方文档见此：<a href="https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html" target="_blank" rel="noopener">https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html</a></li>
<li>本系列对应的版本环境：<a href="mailto:ElasticSearch@7.3.1" target="_blank" rel="noopener">ElasticSearch@7.3.1</a>，<a href="mailto:NEST@7.3.1" target="_blank" rel="noopener">NEST@7.3.1</a>，IDE 和开发平台默认为 VS2019，.NET CORE 2.1</li>
</ul>
</blockquote>
<hr>
<p>Elasticsearch.Net 和 NEST 对比说明：</p>
<ul>
<li>Elasticsearch 官方为 .NET 提供了 2 个官方客户端库：Elasticsearch.Net 和 NEST。</li>
<li>可以简单理解为 Elasticsearch.Net 是 NEST 的一个子集。</li>
<li>NEST 内部使用了 ElasticSearch.Net ，并通过 NEST 可以对外暴露 ElasticSearch.Net 客户端。</li>
<li>但 NEST 包含了 ElasticSearch.Net 所没有的一些高级功能，如：<ul>
<li>强类型查询 DSL：可以将所有请求和响应的对象类型转换 1:1 的.NET 类型。</li>
<li>自动转换为 CLR 的数据类型。</li>
</ul>
</li>
</ul>
<p>基本上 .NET 项目到了要使用上 ElasticSearch 的地步，直接选择 NEST 即可。</p>
<p>在使用 NEST 作为客户端的时候，建议将 ElasticClient 对象作为单例来使用。</p>
<ul>
<li>ElasticClient 被设计为线程安全。</li>
<li>ES 中的缓存是根据 ConnectionSettings 来划分的，即服务端缓存针对的是每一个  ConnectionStrings</li>
<li><strong>例外：</strong> 当你需要连接不同的 ES 集群的时候，就不要用单例了，应为不同的 ElasticClient 使用不同的 ConnectionStrings。</li>
</ul>
<h1 id="快速使用"><a href="#快速使用" class="headerlink" title="快速使用"></a>快速使用</h1><blockquote>
<ul>
<li>使用 Nest 的时候约定 Nest 版本需要跟 ElasticSearch 版本保持一致，即服务端 ES版本为 7.3.1，则 Nest 版本也要使用 7.3.1</li>
<li><strong>以下示例通过 IoC 进行注入（单例），你也可以直接通过单例模式来实现。</strong></li>
</ul>
</blockquote>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/Elasticsearch-Nest-QuickStart.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/StackExchangeRedis-Testing.html">StackExchange.Redis 系列 12：Testing 套件说明</a></h1>
  


      
        <time datetime="2020-01-08T06:46:43.000Z">
          create: 2020-01-08 14:46:43 | update: 2020-01-08 15:00:00
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;683&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;3&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译，并非完全将官方文档进行翻译，而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。</li>
<li>原始文档见此：<a href="https://stackexchange.github.io/StackExchange.Redis/" target="_blank" rel="noopener">https://stackexchange.github.io/StackExchange.Redis/</a></li>
<li>本系列本博文基于 redis 5.0.6，系列中部分博文跟官方文档有出入，有不同见解 / 说明不当的地方，还请大家不吝拍砖。</li>
</ul>
</blockquote>
<blockquote>
<p>StackExchange.Redis 为 windows 环境提供了测试套件，截至本文发布前，作者尚未正式发布跨平台的套件信息。</p>
</blockquote>
<p>StackExchange.Redis 提供的单元和继承测试很简单，有 2 个主要步骤：</p>
<ol>
<li>开启服务器</li>
<li>运行测试</li>
</ol>
<ul>
<li>测试默认使用本机 Redis 服务（127.0.0.1），你可以修改 json 配置来自定义。</li>
</ul>
<p></p><p class="code-caption" data-lang="json" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="json">{
  &quot;RunLongRunning&quot;: true,
  &quot;MasterServer&quot;: &quot;192.168.10.5&quot;,
  &quot;MasterPort&quot;: 2333
}
</code></pre>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/StackExchangeRedis-Testing.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/StackExchangeRedis-Scripting.html">StackExchange.Redis 系列 11：Scripting 说明</a></h1>
  


      
        <time datetime="2020-01-08T06:15:43.000Z">
          create: 2020-01-08 14:15:43 | update: 2020-01-08 14:45:59
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;515&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;2&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译，并非完全将官方文档进行翻译，而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。</li>
<li>原始文档见此：<a href="https://stackexchange.github.io/StackExchange.Redis/" target="_blank" rel="noopener">https://stackexchange.github.io/StackExchange.Redis/</a></li>
<li>本系列本博文基于 redis 5.0.6，系列中部分博文跟官方文档有出入，有不同见解 / 说明不当的地方，还请大家不吝拍砖。</li>
</ul>
</blockquote>
<p>StackExchange.Redis 库中提供了以下几个接口来让你执行 LUA 基本脚本：</p>
<ul>
<li>IServer.ScriptLoad(Async)</li>
<li>IServer.ScriptExists(Async)</li>
<li>IServer.ScriptFlush(Async)</li>
<li>IDatabase.ScriptEvaluate</li>
<li>IDatabaseAsync.ScriptEvaluateAsync</li>
</ul>
<p>要执行复杂脚本的话，可以通过 LuaScript 类来进行构建。</p>
<p>LuaScript 示例</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/StackExchangeRedis-Scripting.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/StackExchangeRedis-Profiling.html">StackExchange.Redis 系列 10：Profiling | 性能分析</a></h1>
  


      
        <time datetime="2020-01-07T10:06:55.000Z">
          create: 2020-01-07 18:06:55 | update: 2020-01-08 14:15:15
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1.7k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;7&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译，并非完全将官方文档进行翻译，而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。</li>
<li>原始文档见此：<a href="https://stackexchange.github.io/StackExchange.Redis/" target="_blank" rel="noopener">https://stackexchange.github.io/StackExchange.Redis/</a></li>
<li>本系列本博文基于 redis 5.0.6，系列中部分博文跟官方文档有出入，有不同见解 / 说明不当的地方，还请大家不吝拍砖。</li>
</ul>
</blockquote>
<p>StackExchange.Redis公开了一些方法和类型来启用性能分析。</p>
<p>性能分析接口由以下几个接口和方法组成：</p>
<ul>
<li>IProfiler</li>
<li>ConnectionMultiplexer.RegisterProfiler(IProfiler)</li>
<li>ConnectionMultiplexer.BeginProfiling(object)</li>
<li>ConnectionMultiplexer.FinishProfiling(object),</li>
<li>IProfiledCommand</li>
</ul>
<p>你可以通过 ConnectionMultiplexer 来注册一个 IProfiler 实例，无法被更改。</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/StackExchangeRedis-Profiling.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/StackExchangeRedis-keys-scan-flushdb-command.html">StackExchange.Redis 系列 9：使用 KEYS, SCAN, FLUSHDB 等命令</a></h1>
  


      
        <time datetime="2020-01-07T09:08:18.000Z">
          create: 2020-01-07 17:08:18 | update: 2020-01-07 17:43:12
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;561&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;2&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译，并非完全将官方文档进行翻译，而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。</li>
<li>原始文档见此：<a href="https://stackexchange.github.io/StackExchange.Redis/" target="_blank" rel="noopener">https://stackexchange.github.io/StackExchange.Redis/</a></li>
<li>本系列本博文基于 redis 5.0.6，系列中部分博文跟官方文档有出入，有不同见解 / 说明不当的地方，还请大家不吝拍砖。</li>
</ul>
</blockquote>
<blockquote>
<p>StackExchange.Redis 面向的是 redis 集群，所以需要直到哪些命令面向 database，哪些命令面向 server。<br>KEYS, SCAN, FLUSHDB 这些命令都属于<strong>服务端</strong>命令。</p>
</blockquote>
<p>以下命令面向的是单台服务器（包含但不限于）</p>
<ul>
<li>KEYS / SCAN：仅列出当前服务器上的 key；不包括更广逻辑上的 database。</li>
<li>FLUSHDB / FLUSHALL：仅移除当前服务器上的 key，不包括更广逻辑上的 database。</li>
<li>RANDOMKEY：仅随机选择当前服务器上的 key，不包括更广逻辑上的 database。</li>
<li>CLIENT</li>
<li>CLUSTER</li>
<li>CONFIG / INFO / TIME</li>
<li>SLAVEOF</li>
<li>SAVE / BGSAVE / LASTSAVE</li>
<li>SCRIPT (not to be confused with EVAL / EVALSHA)</li>
<li>SHUTDOWN</li>
<li>SLOWLOG</li>
<li>PUBSUB (not to be confused with PUBLISH / SUBSCRIBE / etc)</li>
<li>some DEBUG operations</li>
</ul>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/StackExchangeRedis-keys-scan-flushdb-command.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/StackExchangeRedis-stream.html">StackExchange.Redis 系列 8：Stream 数据类型说明</a></h1>
  


      
        <time datetime="2020-01-07T08:08:07.000Z">
          create: 2020-01-07 16:08:07 | update: 2020-01-07 17:07:39
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1.3k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;5&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译，并非完全将官方文档进行翻译，而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。</li>
<li>原始文档见此：<a href="https://stackexchange.github.io/StackExchange.Redis/" target="_blank" rel="noopener">https://stackexchange.github.io/StackExchange.Redis/</a></li>
<li>本系列本博文基于 redis 5.0.6，系列中部分博文跟官方文档有出入，有不同见解 / 说明不当的地方，还请大家不吝拍砖。</li>
</ul>
</blockquote>
<h1 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h1><blockquote>
<ul>
<li>Stream 数据类型是在 Redis 5.0 版本新引入的。它以更抽象的方式来模拟日志数据结构。</li>
<li>目前 StackExchange.Redis 客户端已经实现了所有原生 Stream 相关的命令。</li>
<li>关于 Stream 的介绍可以<a href="https://redis.io/topics/streams-intro" target="_blank" rel="noopener">见此</a>。</li>
</ul>
</blockquote>
<h1 id="往-Streams-中写入数据"><a href="#往-Streams-中写入数据" class="headerlink" title="往 Streams 中写入数据"></a>往 Streams 中写入数据</h1><ul>
<li>Stream 中的每条消息/条目都由 StreamEntry 类型表示。每个 Stream 条目包含一个唯一的 ID 和一个 Name/Value 对。</li>
</ul>
<p>eg：通过单个 name/value对 往 Stream 中添加一条简单消息</p>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/StackExchangeRedis-stream.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/StackExchangeRedis-pub-sub-message-order.html">StackExchange.Redis 系列 7：pub/sub 消息顺序</a></h1>
  


      
        <time datetime="2020-01-07T07:13:00.000Z">
          create: 2020-01-07 15:13:00 | update: 2020-01-07 15:59:47
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;315&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;1&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译，并非完全将官方文档进行翻译，而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。</li>
<li>原始文档见此：<a href="https://stackexchange.github.io/StackExchange.Redis/" target="_blank" rel="noopener">https://stackexchange.github.io/StackExchange.Redis/</a></li>
<li>本系列本博文基于 redis 5.0.6，系列中部分博文跟官方文档有出入，有不同见解 / 说明不当的地方，还请大家不吝拍砖。</li>
</ul>
</blockquote>
<p>当你使用 pub/sub 的时候，需要考虑在一个连接中，消息是顺序处理还是并行处理。StackExchange 推荐如果可以的话是并行处理。</p>
<p>顺序处理的好处是你不需要要担心线程安全，且处理消息的顺序和消息的发送顺序是一致的（通过队列），但问题是消息间有可能相互延时。</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">multiplexer.GetSubscriber().SubScribe(&quot;messages&quot;, (channel, message) =&gt; {
    Console.WriteLine((string)message);
    });
</code></pre>
<p>并发处理的好处是更快，可扩展性更高，一般消息间没有什么关联的时候用并发模式。并发的问题是因为消息是无序的，你需要自己保证并发消息不会破坏你的内部状态。</p>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">var channelMessageQueue = multiplexer.GetSubscriber().SubScribe(&quot;messages&quot;);
channel.OnMessage(message =&gt;{
    Console.WriteLine((string)message.Message);
    });
</code></pre>

      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/StackExchangeRedis-Events.html">StackExchange.Redis 系列 6：Events 说明</a></h1>
  


      
        <time datetime="2020-01-07T06:45:22.000Z">
          create: 2020-01-07 14:45:22 | update: 2020-01-07 15:12:50
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;504&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;1&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译，并非完全将官方文档进行翻译，而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。</li>
<li>原始文档见此：<a href="https://stackexchange.github.io/StackExchange.Redis/" target="_blank" rel="noopener">https://stackexchange.github.io/StackExchange.Redis/</a></li>
<li>本系列本博文基于 redis 5.0.6，系列中部分博文跟官方文档有出入，有不同见解 / 说明不当的地方，还请大家不吝拍砖。</li>
</ul>
</blockquote>
<p>ConnectionMultiplexer 对外提供了多个事件以便让你可以捕获内部执行情况，你可以通过这些事件按需记录日志。</p>
<h1 id="事件"><a href="#事件" class="headerlink" title="事件"></a>事件</h1><ul>
<li>ConfigurationChanged：当 ConnectionMultiplexer 中的连接发生改变的时候该事件会被触发。</li>
<li>ConfigurationChangedBroadcast：当通过 pub/sub 接收到重新配置的消息时，该事件会被触发。通常情况下，引发该事件的是调用 IServer.MakeMaster 去改变一个节点的副本配置（该节点可以将此类请求广播到所有客户端。）</li>
<li>ConnectionFailed：任何原因导致物理连接失败的时候会触发该事件。在下次连接被重新成功建立前，该事件只会触发一次。</li>
<li>ConnectionRestored：在上一次连接失败后，连接重新被建立（恢复）的时候，会触发该事件。</li>
<li>ErrorMessage：当 Redis 服务端用错误信息响应客户端请求的时候，该事件会被触发。另外，触发该事件后，常规的异常/错误依然会返回/告知到调用方。</li>
<li>HashSlotMoved：使用“redis 集群”的时候，当 hash-slot 在节点间发生迁移的时候，该事件就会别触发。注意，请求会自动重新路由，一般用户不需要做什么特殊操作。</li>
<li>InternalError：当 StackExchange.Redis 库内部发生错误的时候会触发该事件，一般在 DEBUG 的时候可以使用该事件。</li>
</ul>
<p>请注意，StackExchange.Redis中的 pub/sub 实现与事件类似，Subscribe / SubscribeAsync 方法接受一个 Action&lt;RedisChannel，RedisValue&gt; 回调，该回调在收到消息时会被触发。</p>

      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/StackExchangeRedis-Transaction.html">StackExchange.Redis 系列 5：事务</a></h1>
  


      
        <time datetime="2020-01-07T06:03:08.000Z">
          create: 2020-01-07 14:03:08 | update: 2020-01-08 09:55:10
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;947&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;3&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译，并非完全将官方文档进行翻译，而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。</li>
<li>原始文档见此：<a href="https://stackexchange.github.io/StackExchange.Redis/" target="_blank" rel="noopener">https://stackexchange.github.io/StackExchange.Redis/</a></li>
<li>本系列本博文基于 redis 5.0.6，系列中部分博文跟官方文档有出入，有不同见解 / 说明不当的地方，还请大家不吝拍砖。</li>
</ul>
</blockquote>
<h1 id="Redis-中的事务说明"><a href="#Redis-中的事务说明" class="headerlink" title="Redis 中的事务说明"></a>Redis 中的事务说明</h1><ul>
<li>Redis 中的事务跟我们常说的数据库事务不同：<ul>
<li>数据库事务必须保证全部成功，否则就回滚。</li>
<li>而 Redis 中的事务更偏向于“一组打包的批量执行脚本”，其中任何一条命令的执行失败，不会导致已经执行的命令回滚，也不会中断后续的命令执行。</li>
</ul>
</li>
<li>在使用数据库事务的时候，你可以在事务中使用条件判断。但在 Redis 事务中，你无法使用条件判断。（条件见下方说明）</li>
</ul>
<h1 id="如何使用事务？"><a href="#如何使用事务？" class="headerlink" title="如何使用事务？"></a>如何使用事务？</h1><ul>
<li>在 Redis 原生命令中使用 MULTI 来开启事务，EXEC 来执行事务（或者 DISCARD 来取消事务）</li>
<li>一旦使用 MULTI，在 MULTI 之后的命令不会立即执行，它们会排队，直到接收到 EXEC命令。如果接收到的时 DISCARD 命令，则所有已传输的命令会全部抛弃。<ul>
<li>因为 Redis 命令会排队执行，所以无法在 Redis 中使用条件判断。</li>
</ul>
</li>
</ul>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/StackExchangeRedis-Transaction.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  
    <article class="post">
  
  <div class="post-content">
    <header>
      
        <div class="icon"></div>
      

 
      
  
    <h1 class="title"><a href="/2020/01/backend/StackExchangeRedis-Keys-Values-Channels.html">StackExchange.Redis 系列 4：Keys, Values and Channels 说明</a></h1>
  


      
        <time datetime="2020-01-06T09:58:02.000Z">
          create: 2020-01-06 17:58:02 | update: 2020-01-07 14:02:51
            <span style="float: right;">
    <span class="post-count" id="busuanzi_container_page_pv" style="display: inline;">
        
        <span class="post-count">文章总字数:&nbsp;1k&nbsp;字</span>
    <span class="blueSeparate">&nbsp;|&nbsp;</span>
    <span class="post-count">阅读约需:&nbsp;3&nbsp;分钟</span>
    <br>
</span>
</span>
        </time>
      
            
    </header>
    <div class="entry">
      
      <blockquote>
<ul>
<li>本系列博文是“伪”官方文档翻译，并非完全将官方文档进行翻译，而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。</li>
<li>原始文档见此：<a href="https://stackexchange.github.io/StackExchange.Redis/" target="_blank" rel="noopener">https://stackexchange.github.io/StackExchange.Redis/</a></li>
<li>本系列本博文基于 redis 5.0.6，系列中部分博文跟官方文档有出入，有不同见解 / 说明不当的地方，还请大家不吝拍砖。</li>
</ul>
</blockquote>
<h1 id="Keys"><a href="#Keys" class="headerlink" title="Keys"></a>Keys</h1><ul>
<li>在 redis 的数据库中，key 是唯一的。</li>
<li>在集群或者分片系统中，key定义了包含该数据的节点，因此 key 对于 routing commands而言相当重要。</li>
<li>在 StackExchange.Redis 中，通过 RedisKey 这个类型来表示 keys。内部已经做好了 string 和 byte[] 类型之间的转换。并且允许你使用”字符串“作为键，或者”字节数组“作为键，如：</li>
</ul>
<p></p><p class="code-caption" data-lang="csharp" data-line_number="backend" data-trim_indent="backend" data-label_position="outer" data-labels_left="Code" data-labels_right=":" data-labels_copy="Copy Code"><span class="code-caption-label"></span></p><p></p>
<pre><code class="csharp">string key = ...;
db.StringIncrement(key);
//以上命令等价于
byte[] key = ...
db.StringIncrement(key);
</code></pre>
<ul>
<li>StackExchange.Redis 提供了获取 key 的操作，且相当便利，如下：</li>
</ul>
      

      <div>
        
      </div>
    </div>

    <footer>
      
      
      <div class="alignleft">
        <a href="/2020/01/backend/StackExchangeRedis-Keys-Values-Channels.html#more" class="more-link">Read More</a>
      </div>
      
      
      
      <div class="clearfix"></div>
    </footer>
  </div>
</article>

<!--  --> <!--启用/关闭 LeanCloud 评论-->
  

  <nav id="pagination">
  
    <a href="/categories/backend/page/4/" class="alignleft prev">上一页</a>
  
  
    <a href="/categories/backend/page/6/" class="alignright next">下一页</a>
  
  <div class="clearfix"></div>
</nav>
</div></div>
    <aside id="sidebar" class="alignright">
  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-category"></i>&nbsp;&nbsp;分类</h3>
  <ul class="entry">
  
    <li><a href="/categories/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/categories/PowerUser/">PowerUser</a><small>4</small></li>
  
    <li><a href="/categories/backend/">backend</a><small>57</small></li>
  
    <li><a href="/categories/frontend/">frontend</a><small>9</small></li>
  
    <li><a href="/categories/operations/">operations</a><small>5</small></li>
  
    <li><a href="/categories/提前退休/">提前退休</a><small>2</small></li>
  
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-new3"></i>&nbsp;&nbsp;最新文章</h3>
  <ul class="entry">
    
      <li>
        <a href="/2024/11/PowerUser/install-docker-in-pve-lxc.html">1. 通过 PVE LXC 搭建 docker 环境</a>
      </li>
    
      <li>
        <a href="/2024/11/Obsidian/obsidian-render-pie-chart.html">2. 2 套用于 obsidian 的生成时间占用饼图脚本示例，基于 templater， charts，echarts+dataview</a>
      </li>
    
      <li>
        <a href="/2024/10/PowerUser/fix-ios18-samba-readonly-issue.html">3. 解决 ios 18（包括ipadOS 18） 下通过文件(files app)连接 samba 服务器，目录变成只读权限的问题</a>
      </li>
    
      <li>
        <a href="/2023/07/operations/how-to-use-pm2.html">4. PM2 的安装、配置和使用</a>
      </li>
    
      <li>
        <a href="/2023/07/backend/expose-intranet-netcoreapi-to-internet.html">5. 通过 DDNS+显性URL 把内网部署的.NET CORE WEBAPI 项目暴露到公网中</a>
      </li>
    
  </ul>
</div>


  
<div class="widget tag">
  <h3 class="title"><i class="iconfont icon-tag"></i>&nbsp;&nbsp;标签</h3>
  <ul class="entry">
  
    <li><a href="/tags/net-core/">.net core</a><small>12</small></li>
  
    <li><a href="/tags/Debian/">Debian</a><small>2</small></li>
  
    <li><a href="/tags/Docker/">Docker</a><small>1</small></li>
  
    <li><a href="/tags/Elasticsearch/">Elasticsearch</a><small>35</small></li>
  
    <li><a href="/tags/Elasticsearch-Nest系列/">Elasticsearch.Nest系列</a><small>35</small></li>
  
    <li><a href="/tags/Obsidian/">Obsidian</a><small>1</small></li>
  
    <li><a href="/tags/PVE/">PVE</a><small>2</small></li>
  
    <li><a href="/tags/StackExchange-Redis系列/">StackExchange.Redis系列</a><small>12</small></li>
  
    <li><a href="/tags/centos/">centos</a><small>3</small></li>
  
    <li><a href="/tags/flex/">flex</a><small>1</small></li>
  
    <li><a href="/tags/ios/">ios</a><small>1</small></li>
  
    <li><a href="/tags/javascript/">javascript</a><small>1</small></li>
  
    <li><a href="/tags/linux/">linux</a><small>4</small></li>
  
    <li><a href="/tags/nginx/">nginx</a><small>2</small></li>
  
    <li><a href="/tags/nuget/">nuget</a><small>2</small></li>
  
    <li><a href="/tags/react/">react</a><small>6</small></li>
  
    <li><a href="/tags/styled-components/">styled-components</a><small>1</small></li>
  
    <li><a href="/tags/内网穿透/">内网穿透</a><small>4</small></li>
  
    <li><a href="/tags/培训讲义/">培训讲义</a><small>2</small></li>
  
    <li><a href="/tags/基础知识/">基础知识</a><small>2</small></li>
  
    <li><a href="/tags/性能优化/">性能优化</a><small>2</small></li>
  
    <li><a href="/tags/教程/">教程</a><small>64</small></li>
  
    <li><a href="/tags/理财/">理财</a><small>2</small></li>
  
    <li><a href="/tags/生命周期/">生命周期</a><small>1</small></li>
  
    <li><a href="/tags/经验/">经验</a><small>4</small></li>
  
  </ul>
</div>


  
  <script type="text/javascript" charset="utf-8" src="/js/tagcloud.js"></script>
  <script type="text/javascript" charset="utf-8" src="/js/tagcanvas.js"></script>
  <div class="widget tag">
    <h3 class="title"><i class="iconfont icon-cloud1"></i>&nbsp;&nbsp;标签云</h3>
    <div id="myCanvasContainer" class="widget tagcloud">
      <canvas width="250" height="250" id="resCanvas" style="width:100%">
        <a href="/tags/net-core/" style="font-size: 17.14px;">.net core</a> <a href="/tags/Debian/" style="font-size: 11.43px;">Debian</a> <a href="/tags/Docker/" style="font-size: 10px;">Docker</a> <a href="/tags/Elasticsearch/" style="font-size: 18.57px;">Elasticsearch</a> <a href="/tags/Elasticsearch-Nest系列/" style="font-size: 18.57px;">Elasticsearch.Nest系列</a> <a href="/tags/Obsidian/" style="font-size: 10px;">Obsidian</a> <a href="/tags/PVE/" style="font-size: 11.43px;">PVE</a> <a href="/tags/StackExchange-Redis系列/" style="font-size: 17.14px;">StackExchange.Redis系列</a> <a href="/tags/centos/" style="font-size: 12.86px;">centos</a> <a href="/tags/flex/" style="font-size: 10px;">flex</a> <a href="/tags/ios/" style="font-size: 10px;">ios</a> <a href="/tags/javascript/" style="font-size: 10px;">javascript</a> <a href="/tags/linux/" style="font-size: 14.29px;">linux</a> <a href="/tags/nginx/" style="font-size: 11.43px;">nginx</a> <a href="/tags/nuget/" style="font-size: 11.43px;">nuget</a> <a href="/tags/react/" style="font-size: 15.71px;">react</a> <a href="/tags/styled-components/" style="font-size: 10px;">styled-components</a> <a href="/tags/内网穿透/" style="font-size: 14.29px;">内网穿透</a> <a href="/tags/培训讲义/" style="font-size: 11.43px;">培训讲义</a> <a href="/tags/基础知识/" style="font-size: 11.43px;">基础知识</a> <a href="/tags/性能优化/" style="font-size: 11.43px;">性能优化</a> <a href="/tags/教程/" style="font-size: 20px;">教程</a> <a href="/tags/理财/" style="font-size: 11.43px;">理财</a> <a href="/tags/生命周期/" style="font-size: 10px;">生命周期</a> <a href="/tags/经验/" style="font-size: 14.29px;">经验</a>
      </canvas>
    </div>
  </div>




</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><div class="alignleft">

  
  &copy; 2018 - 2024 &nbsp;<a href='/about'>积慕</a>
  
  &nbsp;&nbsp;<a href='https://www.cnblogs.com/deepthought/'>我的博客园地址</a>
  &nbsp;&nbsp;finalclassic#outlook.com
</div>

<div class="clearfix"></div>
<div>
  本站主题基于：<a href='https://github.com/hexojs/hexo-theme-light' rel="external nofollow">hexo-theme-light</a>
</div>
<div id="busuanzi_container_site_pv">
  本站总访问量&nbsp;<span id="busuanzi_value_site_pv"></span>&nbsp;次
</div>
<div style="width:300px;margin:0 auto; padding:20px 0;">
  <a target="_blank" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=31011702004805" style="display:inline-block;text-decoration:none;height:20px;line-height:20px;">
    <img src="https://pic.zhuliang.ltd/20200102164648.png" style="float:left;"><p style="float:left;height:20px;line-height:20px;margin: 0px 0px 0px 5px; color:#939393;">沪公网安备 31011702004805号</p></a>
</div></footer>
  <script src="/js/jquery-2.0.3.min.js"></script>
<script src="/js/jquery.imagesloaded.min.js"></script>
<script src="/js/gallery.js"></script>




<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
(function($){
  $('.fancybox').fancybox();
})(jQuery);
</script>


<script type="text/javascript">
hljs.initHighlightingOnLoad();
</script>

<!-- <script src="/js/busuanzi.pure.mini.js"></script> -->
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<script>
    var _hmt = _hmt || [];
    (function () {
        var hm = document.createElement("script");
        hm.src = "https://hm.baidu.com/hm.js?ea793b9c8d6b31df666a6bc15038e246";
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(hm, s);
    })();
</script>
<script>
    (function () {
        var bp = document.createElement('script');
        var curProtocol = window.location.protocol.split(':')[0];
        if (curProtocol === 'https') {
            bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
        }
        else {
            bp.src = 'http://push.zhanzhang.baidu.com/push.js';
        }
        var s = document.getElementsByTagName("script")[0];
        s.parentNode.insertBefore(bp, s);
    })();
</script>
</body>
</html>
